#include<iostream>
#include<signal.h>
#include<unistd.h>

using namespace std;
void PrintPending(sigset_t &pending)
{
    for(int sigo = 31;sigo>=1;sigo--)
    {
        if(sigismember(&pending,sigo))
        {
            cout<<"1";
        }
        else{
            cout<<"0";
        }
    }
    cout<<endl;
}


void handler(int sigo)
{
    cout<<"catch a sigo"<<sigo<<endl;
}



int main()
{
    signal(2,handler);
    //1.1先对二号信号进行频闭 --- 数据预备
    sigset_t bset,oset;  //在用户栈上开辟空间
    sigemptyset(&bset);  
    sigemptyset(&oset);
    sigaddset(&bset,2);    //屏蔽二号信号,但没有设置进task_struct
    //1.2调用系统调用,将屏蔽设置进内核
    sigprocmask(SIG_SETMASK,&bset,&oset);

    //2重复打印进程的pending
    int cnt  = 0;
    sigset_t pending;
    while(cnt < 20)
    {
        int n = sigpending(&pending);
        //2.1获取
        if(n > 0)
        {
            continue;
        }
        //2.2打印
        PrintPending(pending);
        sleep(1);
        cnt++;

    }
    //3.解除阻塞
    //sigprocmask(SIG_SETMASK,&oset,nullptr);
    //PrintPending(pending);


    //
    return 0;
}
